
package gamebook;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import persistencia.PPartida;


public class Partida {
    private int idPartida;
    private UsuarioGenerico uRetador;
    private UsuarioGenerico uRetado;
    private String colorRetador;
    private int estado;
    private Date fInicio,fFin;
    private UsuarioGenerico ganador;

    public Partida(int partida,String colorRetador, Date fInicio ,UsuarioGenerico uRetador, UsuarioGenerico uRetado, int estado) {
        this.idPartida = partida;
        this.fInicio = fInicio;
        this.colorRetador = colorRetador;
        this.uRetador = uRetador;
        this.uRetado = uRetado;
        this.estado = estado;
    }
    public Partida(String colorRetador, Date fInicio, UsuarioGenerico uRetador, UsuarioGenerico uRetado, int estado) {
        this.uRetador = uRetador;
        this.fInicio = fInicio;
        this.colorRetador = colorRetador;
        this.uRetado = uRetado;
        this.estado = estado;
    }
    public Partida(){}

    public Date getfFin() {
        return fFin;
    }

    public void setfFin(Date fFin) {
        this.fFin = fFin;
    }

    public Date getfInicio() {
        return fInicio;
    }

    public void setfInicio(Date fInicio) {
        this.fInicio = fInicio;
    }

    public String getColorRetador() {
        return colorRetador;
    }

    public void setColorRetador(String colorRetador) {
        this.colorRetador = colorRetador;
    }

    public int getEstado() {
        return estado;
    }

    public void setEstado(int estado) {
        this.estado = estado;
    }

    public int getIdPartida() {
        return idPartida;
    }

    public void setIdPartida(int idPartida) {
        this.idPartida = idPartida;
    }

    public UsuarioGenerico getuRetado() {
        return uRetado;
    }

    public void setuRetado(UsuarioGenerico uRetado) {
        this.uRetado = uRetado;
    }

    public UsuarioGenerico getuRetador() {
        return uRetador;
    }

    public void setuRetador(UsuarioGenerico uRetador) {
        this.uRetador = uRetador;
    }

    public UsuarioGenerico getGanador() {
        return ganador;
    }

    public void setGanador(UsuarioGenerico ganador) {
        this.ganador = ganador;
    }
    
    
    public boolean darAlta() throws SQLException, Exception{
        return PPartida.darAltaBD(this);
    }
    
    /**
     * Dada una partida, devuelve quién es el oponente del usuario que le pasamos
     * al método. Si el usuario pasado como parámetro no pertenece a la partida
     * nos devolverá null
     * @param usuarioGenerico usuario del que queremos saber el oponente
     * @return devuelve al oponente de un usuario en la partida
     */
    public UsuarioGenerico getOponente(UsuarioGenerico usuarioGenerico){
        UsuarioGenerico oponente=null;
        
        if(usuarioGenerico.getId()==this.getuRetado().getId()){
            //Si el usuario es el Retado, devolvemos al Retador
            oponente=this.getuRetador();
        }else if(usuarioGenerico.getId()==this.getuRetador().getId()){
            //Si el usuario es el Retador, devolvemos al Retado
            oponente=this.getuRetado();
        }
        
        //Si el usuario no era ninguno de los dos, devolvemos null
        return oponente;
    }
    
    /**
     * Devuelve la lista de partidas en las que está involucrado un cierto usuario
     * según el criterio del entero 'selector'
     * @param ug UsuarioGenerico del que queremos las partidas
     * @param selector Entero que indica, 0:partidas sin empezar o en curso, 1:partidas terminadas
     * @return 
     */
    public static List<Partida> seleccionarPorUsuarioGenerico(UsuarioGenerico usuarioGenerico,int selector){
        return PPartida.seleccionarPorUsuarioGenericoBD(usuarioGenerico,selector);
    }
    
    public List<String> getMovimientos(){
        return PPartida.seleccionarMovimientosBD(this);
    }
    
    /**
     * Devuelve de la base de datos el objeto Partida que coincide con el id proporcionado
     * @param id entero id_partida
     * @return devuelve el objeto partida con el id elegido
     */
    public static Partida seleccionarPorId(int id){
        return PPartida.seleccionarPorIdBD(id);
    }
    
    public boolean turno(UsuarioGenerico usuario){
        return PPartida.turno(usuario,this);
    }

    /**
     * Da de alta un nuevo movimiento en la partida
     * @param movimiento String que describe el movimiento
     * @return boolean true o false que depende del exito de la acción
     */
    public boolean darAltaMovimiento(String movimiento) {
        return PPartida.darAltaMovimientoBD(this, movimiento);
    }
    
    /*Aceptar un reto que se convierte en una partida*/
    public void aceptarReto(){
        PPartida.aceptarReto(this);
    }
    /*Aceptar un reto que se convierte en una partida*/
    public void rechazarReto(){
        PPartida.rechazarReto(this);
    }

    /**
     * Actualiza los datos de una partida en la base de datos
     * @return boolean true o false que depende del exito de la acción
     */
    public boolean actualizar(){
        return PPartida.actualizarBD(this);
    }
}
